package org.smile.strate.action;

import org.smile.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

public class ActionElementUriInfo {
    /**url中的参数名称  例如/find/{name}/{age}*/
    private String url;
    /**解析出的action的名称*/
    private String actionName;
    /**url中的参数信息*/
    private Arg[] urlArgs;

    public ActionElementUriInfo(String url){
        this.url=url;
        int idx=url.indexOf('{');
        if(idx>0) {
            String paramUrl=url.substring(idx);
            String[] args=paramUrl.split("/");
            urlArgs =new Arg[args.length];
            for(int i=0;i<args.length;i++) {
                String content=args[i];
                int first=content.indexOf('{');
                if(first==-1){
                    throw  new StrateInitException("url arg name parser error"+ url +"->"+content);
                }
                int end = content.indexOf('}');
                if(end==-1){
                    throw new StrateInitException("url arg name parser error"+ url +"->"+content);
                }
                urlArgs[i]=new Arg(StringUtils.substring(content,first+1,end).trim(),first,content.length()-end-1);
            }
            this.actionName=url.substring(0,idx-1);
        }else{
            this.actionName=url;
        }
    }

    public String getUrl() {
        return url;
    }

    public String getActionName() {
        return actionName;
    }

    /**
     * 解析参数值
     * @return
     */
    public Map<String,String> parserArgsValue(String[] valueStrings){
        Map<String,String> values= new HashMap<>();
        for(int i=0;i<urlArgs.length;i++){
            if(i>=valueStrings.length){
                break;
            }
            Arg arg=this.urlArgs[i];
            String content=valueStrings[i];
            String value=arg.needCut()?StringUtils.substring(content,arg.first,content.length()-arg.tail):content;
            values.put(arg.name,value);
        }
        return values;
    }

    /**
     * 是否存在URL参数
     * @return
     */
    public boolean hasArgs(){
        return urlArgs !=null;
    }

    class Arg
    {
        //头部截取字符个数
        int first;
        //尾部截取字条个数
        int tail;
        //参数名称
        String name;

        Arg(String name,int first,int tail){
            this.name=name;
            this.first=first;
            this.tail=tail;
        }

        /**
         * 是否需截取
         * @return
         */
        boolean needCut(){
            return first!=0||tail!=0;
        }
    }
}
